home *** CD-ROM | disk | FTP | other *** search
/ Deutsche Edition 1 / Deutsche Edition 1.iso / amok / amok_lha / amok59.lha / AmokEd_V1.02b / txt / EdGadgets.mod < prev    next >
Text File  |  1993-08-15  |  5KB  |  176 lines

  1. (*************************************************************************
  2.  
  3. :Program.    EdGadgets.mod
  4. :Contents.   Gadget-Routines for AmokEd (Datas in EdGlobalVars)
  5. :Author.     Hartmut Goebel
  6. :Copyright.  Copyright © 1989 by Thomas Siemens and Volker Rudolph
  7. :Copyright.  Oberon-Implementation Copyright © 1991 by Hartmut Goebel
  8. :Language.   Oberon
  9. :Translator. AmigaOberon V2.00
  10. :History.    V1.0, 19 Feb 1991 Hartmut Goebel
  11. :Bugs.       PropGad funktioniert noch nicht richtig
  12. :Date.       17 Oct 1991 21:14:04
  13.  
  14. *************************************************************************)
  15.  
  16. MODULE EdGadgets;
  17.  
  18. IMPORT
  19.   edD: EdDisplay,
  20.   edG: EdGlobalVars,
  21.   I  : Intuition,
  22.   g  : Graphics,
  23.   lst: EdLists,
  24.   sys: SYSTEM;
  25.  
  26. VAR
  27.   KnobModified: BOOLEAN;
  28.  
  29. PROCEDURE SetProp*; (* bei Änderungen Def. in edG. korrigieren!! *)
  30. VAR
  31.   newPot,newBody: LONGINT;
  32.   i: LONGINT;
  33. BEGIN
  34.   IF edG.Text.numberOfLines-edG.Rows > 1 THEN
  35.     i := edG.Text.numberOfLines-edG.Rows - 1;
  36.     newPot := 0FFFFH DIV i * edG.Text.topLine;
  37.     IF newPot > 0FFFFH THEN newPot := 0FFFFH; END;
  38.   ELSE
  39.     newPot := 0;
  40.   END;
  41.   IF edG.Rows < edG.Text.numberOfLines THEN
  42.     newBody := 0FFFFH DIV edG.Text.numberOfLines * edG.Rows;
  43.   ELSE
  44.     newBody := 0FFFFH;
  45.   END;
  46.  
  47.   IF KnobModified OR (edG.Text.propInfo.vertPot # newPot)
  48.   OR (edG.Text.propInfo.vertBody # newBody) THEN
  49.     I.NewModifyProp(edG.Text.propGadget,edG.Text.window,NIL,
  50.                     edG.Text.propInfo.flags,0,newPot,0,newBody,1);
  51.     KnobModified := FALSE;
  52.   END;
  53. END SetProp;
  54.  
  55.  
  56. (* setzt PropGadget entsprechend up/down arrow *)
  57. PROCEDURE DrawKnob*(num: INTEGER);
  58. BEGIN
  59.   IF (num = 2) OR (num = 3) THEN
  60.     KnobModified := TRUE;
  61.     SetProp;
  62.   END;
  63. END DrawKnob;
  64.  
  65.  
  66. (* Verschiebt den ScrollBar entsprechend             *)
  67. (* edG.Text.topLine und Berechnet die Größe des Body *)
  68. (* muß von jeder Prozedur aufgerufen werden, die     *)
  69. (* die Zeilenanzahl ändert oder Zeilen verschiebt    *)
  70.  
  71. PROCEDURE SetPropKnob*; (* bei Änderungen Def. in edG. korrigieren!! *)
  72. CONST
  73.   py = 12;
  74. VAR
  75.   px,
  76.   kyStart,kyEnd,
  77.   kHeight,cHeight: INTEGER; (*USHORT*)
  78.   i: LONGINT;
  79.   newPot: LONGINT; (*ULONG*)
  80. BEGIN
  81.   IF edG.kick20 IN edG.Status THEN SetProp; RETURN; END;
  82.  
  83.   cHeight := edG.Text.propInfo.cHeight-5;
  84.   px := edG.Text.window.width-12;
  85.  
  86.   IF edG.Text.numberOfLines-1 > edG.Rows THEN
  87.     i := edG.Text.numberOfLines-edG.Rows-1;
  88.     newPot := 0FFFFH DIV i * edG.Text.topLine;
  89.     IF newPot >= 0FFFFH THEN newPot := 0FFFFH; END;
  90.   ELSE
  91.     newPot :=  0;
  92.   END;
  93.   (* $RangeChk- *)
  94.   edG.Text.propInfo.vertPot := SHORT(newPot);
  95.   (* $RangeChk= *)
  96.  
  97.   IF edG.Rows <= edG.Text.numberOfLines THEN
  98.     (* $RangeChk- *)
  99.     edG.Text.propInfo.vertBody :=
  100.       SHORT(0FFFFH DIV edG.Text.numberOfLines * edG.Rows);
  101.     kHeight :=  SHORT(cHeight * edG.Rows DIV edG.Text.numberOfLines);
  102.     (* $RangeChk= *)
  103.   ELSE
  104.     edG.Text.propInfo.vertBody := I.maxBody;
  105.     kHeight := cHeight;
  106.   END;
  107.  
  108.   IF kHeight < 3 THEN kHeight := 3; END;
  109.   IF kHeight >= cHeight THEN kHeight := cHeight - 1; END;
  110.  
  111.   (* $RangeChk- *)
  112.   kyStart := py + SHORT(newPot * (cHeight-kHeight) DIV 0FFFFH);
  113.   (* $RangeChk= *)
  114.   kyEnd := kyStart + kHeight;
  115.   IF kyStart > kyEnd THEN kyEnd := kyStart; END;
  116.  
  117.   g.SetAPen(edG.RPort,0);
  118.   g.RectFill(edG.RPort,px-2,py,px+9,py+cHeight);
  119.   g.SetAPen(edG.RPort,1);
  120.   g.RectFill(edG.RPort,px,kyStart,px+7,kyEnd);
  121.  
  122.   KnobModified := TRUE;
  123. END SetPropKnob;
  124.  
  125.  
  126. PROCEDURE MovePropKnob*;
  127. VAR
  128.   n: LONGINT;
  129.   diff: INTEGER;
  130. BEGIN
  131.   n := (edG.Text.numberOfLines-edG.Rows) * edG.Text.propInfo.vertPot DIV 0FFFFH;
  132.   IF n <= 0 THEN
  133.     n := 0;
  134.   ELSIF n >= edG.Text.numberOfLines-edG.Rows THEN
  135.     IF edG.Text.numberOfLines-edG.Rows < 1 THEN
  136.       n := 1;
  137.     ELSE
  138.       n := edG.Text.numberOfLines-edG.Rows - 1;
  139.     END;
  140.   END;
  141.   diff := SHORT(edG.Text.topLine - n);
  142.   IF diff # 0 THEN
  143.     edD.TextCursor(FALSE);
  144.     edD.PutBackLine;
  145.     edG.Text.line := n + (edG.Text.line - edG.Text.topLine);
  146.     edG.Text.topLine := n;
  147.     IF diff > 0 THEN
  148.       lst.GoForwardNil(edG.Text.actLinePtr,diff);
  149.       lst.GoForwardNil(edG.Text.topLinePtr,diff);
  150.       IF diff < (edG.Rows * 2 DIV 3)  THEN
  151.         g.ScrollRaster(edG.RPort,0,-edG.YSize*diff,edD.Col(0),edD.Row(0),
  152.                        edD.Col(edG.Columns)-1,edD.Row(edG.Rows)-1);
  153.         edD.TextDisplaySeg(0,diff);
  154.       END;
  155.     ELSE
  156.       diff := -diff;
  157.       lst.GoBackwardNil(edG.Text.actLinePtr,diff);
  158.       lst.GoBackwardNil(edG.Text.topLinePtr,diff);
  159.       IF diff < (edG.Rows * 2 DIV 3)  THEN
  160.         g.ScrollRaster(edG.RPort,0,edG.YSize*diff,edD.Col(0),edD.Row(0),
  161.                        edD.Col(edG.Columns)-1,edD.Row(edG.Rows)-1);
  162.         edD.TextDisplaySeg(edG.Rows-diff,diff);
  163.       END;
  164.     END;
  165.     edD.TextLoad;
  166.     edD.TextSync;
  167.     IF NOT(edG.alreadyRedrawn IN edG.Status) THEN edD.TextRedisplay; END;
  168.     edD.TextCursor(TRUE);
  169.   ELSIF NOT KnobModified THEN
  170.     SetProp;
  171.   END; (* IF diff # 0 *)
  172. END MovePropKnob;
  173.  
  174. END EdGadgets.
  175.  
  176.